# 1. 导入库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error
from sklearn.preprocessing import LabelEncoder

# region 设置
# 中文字符宽度调整
pd.set_option('display.unicode.east_asian_width', True)
# 显示所有列
pd.set_option('display.max_columns', None)
# 显示所有行
pd.set_option('display.max_rows', None)
# 设置value的显示长度为100，默认为50
pd.set_option('max_colwidth', 100)

# 关键：设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'DejaVu Sans']
# 解决负号显示异常（可选，部分场景需要）
plt.rcParams['axes.unicode_minus'] = False
# endregion


# 2. 数据加载与探索
df = pd.read_csv("../数据挖掘试题/work-1/house_rent.csv")
print("数据前5行：\n", df.head())
print("数据形状：", df.shape)
print("数据类型：\n", df.dtypes)
# 缺失值处理
print("缺失值统计：\n", df.isnull().sum())
# （学生补充缺失值处理代码）

# 3. 数据可视化
# 散点图：面积与租金
plt.scatter(df["area"], df["rent"])
plt.xlabel("房屋面积")
plt.ylabel("月租金")
plt.title("房屋面积与月租金关系")
plt.show()
# （学生补充箱线图、热力图代码）

# 4. 特征工程
# 分类型特征编码
le = LabelEncoder()
df["floor_encoded"] = le.fit_transform(df["floor"])
# 划分X和y
X = df[["area", "room_num", "living_room", "bathroom", "floor_encoded", "distance_sub"]]
y = df["rent"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=2024)

# 5. 建模与预测
model = LinearRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
# 计算评估指标
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"均方误差（MSE）：{mse:.2f}")
print(f"决定系数（R²）：{r2:.2f}")
"""
# 新数据预测
new_data = pd.DataFrame({
    "area": [85],
    "room_num": [2],
    "living_room": [1],
    "bathroom": [1],
    "floor_encoded": [le.transform(["中"])[0]],
    "distance_sub": [1.2]
})
pred_rent = model.predict(new_data)
print(f"新房屋预测月租金：{pred_rent[0]:.2f}元")

# 6. 结果分析
# （学生补充特征影响分析代码与文字说明）
"""
